//
// Created by Hi on 25-8-18.
//

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <qboxlayout.h>
#include <QMainWindow>
#include <QDirModel>
#include <QListView>
#include <QTreeView>
#include <QFileSystemModel>
#include <QTableView>
#include <QLabel>
#include <QProgressBar>
#include <QFutureWatcher>
#include <QStackedWidget>
#include <QComboBox>
#include <QPushButton>
#include <QSplitter>
#include <QStandardItemModel>
#include "FileContextMenu.h"
#include "FolderOnlyProxyModel.h"
class FileContextMenu;
class FolderOnlyProxyModel;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

/**
 * @brief MainWindow 主窗口类
 * 资源管理器的核心类，负责界面初始化、视图切换、文件导航、菜单交互等核心逻辑
 * 继承QMainWindow，支持顶部菜单栏、状态栏、中心区域布局
 */
class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针（默认nullptr，独立窗口）
     */
    explicit MainWindow(QWidget *parent = nullptr);

    /**
     * @brief 析构函数（重写父类析构，确保资源释放）
     */
    ~MainWindow() override;

    // -------------------------- 公共方法（供外部类调用） --------------------------
public:
    /**
     * @brief 更新视图索引
     * 同步更新树视图、列表视图、表格视图的当前选中/根目录索引
     * @param index 目标模型索引（对应文件系统中的某个文件/目录）
     */
    void viewUpdated(QModelIndex index);

    /**
     * @brief 显示状态栏消息
     * 供FileContextMenu等外部类调用，更新状态栏提示（如“已复制文件”“删除成功”）
     * @param message 要显示的消息文本
     */
    void showStatusMessage(const QString &message);

    /**
     * 获取model
     * @return
     */
    QFileSystemModel* getModel() const { return this->fileSystemModel; }




    // -------------------------- 私有槽函数（响应信号） --------------------------
private slots:
    /**
     * 点击表头排序
     * @param logicalIndex
     */
    void onTableHeaderClicked(int logicalIndex);
    /**
     * @brief 显示右键菜单
     * 响应视图（treeView/listView/tableView）的右键点击信号，触发菜单显示
     * @param pos 右键点击的局部坐标（需转换为全局坐标显示菜单）
     */
    void showContextMenu(const QPoint &pos);

    void initModelView();

    void initMenu();

    void initOperationBtn();

    void initSearchEdit();

    void initLayOut();

    /**
     * @brief 处理路径搜索（带参重载）
     * 响应路径下拉框的文本选中信号，跳转到指定路径
     * @param text 选中的路径文本（如“C:/Users/Documents”）
     */
    void handleBtnPathEnter(const QString &text);

    /**
     * @brief 处理路径搜索（无参重载）
     * 响应路径下拉框的回车键信号，触发当前输入路径的跳转
     */
    void handleBtnPathEnter();

    /**
     * @brief 后退按钮点击事件
     * 响应“后退”按钮，跳转到上一个访问的目录（基于indexBack栈）
     */
    void backBtnClicked();

    /**
     * @brief 前进按钮点击事件
     * 响应“前进”按钮，跳转到下一个访问的目录（基于indexNext栈）
     */
    void nextBtnClicked();

    /**
     * @brief 返回上级按钮点击事件
     * 响应“返回上级”按钮，跳转到当前目录的父目录
     */
    void upBtnClicked();

    /**
     * @brief 树视图点击事件
     * 响应树视图的目录点击，更新所有视图到选中目录，并记录历史
     * @param index 点击的树节点索引
     */
    void treeViewClicked(const QModelIndex &index);

    bool handleFileOrDirectory(const QModelIndex &index);

    /**
     * @brief 数据双击事件
     * 响应视图（表格/列表）的文件双击：目录则进入，文件则尝试打开
     * @param index 双击的文件/目录索引
     */
    void DataDoubleClicked(const QModelIndex &index);

    // -------------------------- 菜单栏动作响应（Ui自动关联） --------------------------
    /**
     * @brief 小图标模式触发
     * 响应“视图→小图标”菜单，设置列表视图为小图标模式
     */
    void on_actionSmall_triggered();

    /**
     * @brief 大图标模式触发
     * 响应“视图→大图标”菜单，设置列表视图为大图标模式
     */
    void on_actionBig_triggered();

    /**
     * @brief 中图标模式触发
     * 响应“视图→中图标”菜单，设置列表视图为中图标模式
     */
    void on_actionMiddle_triggered();

    /**
     * @brief 详细模式触发
     * 响应“视图→详细”菜单，切换堆叠窗口到表格视图（显示文件完整属性）
     */
    void on_actionDetail_triggered();

    /**
     * @brief 列表模式触发
     * 响应“视图→列表”菜单，切换堆叠窗口到列表视图（无图标纯列表）
     */
    void on_actionList_triggered();

    /**
     * @brief 新建窗口触发
     * 响应“文件→新建窗口”菜单，创建一个新的资源管理器窗口
     */
    void on_actionNew_triggered();


    /**
     * 回调函数
     * @param results
     */
    void handleRunnableResult(QList<QModelIndex> results);

    // -------------------------- 私有成员变量 --------------------------
private:
    Ui::MainWindow *ui;                  // 界面控件对象
    QLabel *searchStatusLabel;           // 搜索状态标签
    QComboBox *historySearchComBox;      // 路径搜索下拉框
    QLineEdit *searchFileLineEdit;       // 文件搜索框
    QFileSystemModel *fileSystemModel;   // 文件系统模型
    QStack<QModelIndex> *indexBack;      // 后退栈
    QStack<QModelIndex> *indexNext;      // 前进栈
    QTableView *tableView;               // 表格视图
    QTreeView *treeView;                 // 树视图
    QListView *listView;                 // 列表视图
    QStackedWidget *stackWidget;         // 堆叠窗口
    QPushButton *back_btn;               // 后退按钮
    QPushButton *next_btn;               // 前进按钮
    QPushButton *up_btn;                 // 上级目录按钮
    QModelIndex lastModelIndex;          // 上一个选中的索引
    FileContextMenu *m_contextMenu;      // 右键菜单对象）
    QWidget* cenWidget;
    QSplitter *splitter;
    QHBoxLayout *topLayout;
    QVBoxLayout *layout;
    FolderOnlyProxyModel *folderOnlyProxyModel;
    QStandardItemModel *searchResultsModel;
    std::mutex result_mutex;
    int m_sortColumn;   // 当前排序的列索引
    Qt::SortOrder m_sortOrder;  // 当前排序方向（升/降）


    // -------------------------- 私有方法 --------------------------
private:
    void returnToNormalView();

    bool isProxyModelIndex(const QModelIndex &index) const;
    /**
     * @brief 修改图标大小
     * 统一设置列表视图的图标大小、网格间距，用于切换“小/中/大图标”模式
     * @param iconSize 图标尺寸（如16/32/64像素）
     * @param x 网格宽度
     * @param y 网格高度
     */
    void modifyIconSize(int iconSize, int x, int y);

    /**
     * @brief 重置菜单选中状态
     * 取消所有“视图模式”菜单（小/中/大图标、详细、列表）的选中状态，避免多选
     * @param checked 是否选中（默认false，即取消选中）
     */
    void resetCheckStatus(bool checked = false);

    /**
     * @brief 检查前进/后退栈的启用状态
     * 根据栈是否为空，启用/禁用前进、后退按钮（空栈时按钮灰化）
     * 同时限制栈的最大容量（避免内存占用过多）
     */
    void checkStackQueueEnable();

    /**
     * @brief 初始化方法
     * 主窗口的核心初始化：创建控件、设置布局、绑定信号槽、初始化模型/视图
     * 所有界面相关的初始化逻辑集中在此，避免构造函数过于臃肿
     */
    void _init();


    /**
     * @brief 处理文件搜索
     * @param 是否全盘搜索
     * 响应文件搜索框的文本变化，在当前目录下搜索匹配文件（当前仅打印调试信息，待实现）
     */
    void handleFileSearch(bool isAll=false);

    /**
     * @brief 处理文本显示更新
     * 同步更新路径搜索框的文本、搜索框的占位提示（如“在Documents下搜索”）
     * @param index 当前目录的模型索引
     */
    void handleTextDisplay(const QModelIndex &index);

    /**
     * @brief 处理状态栏显示更新
     * 计算当前目录下的文件/文件夹数量，更新状态栏文本（如“当前目录: Documents | 文件夹: 5 | 文件: 20”）
     * @param path 当前目录路径
     */
    void handleStatusBarDisplay(const QString &path);

protected:
    bool eventFilter(QObject *obj, QEvent *event) override;

};


#endif // MAINWINDOW_H